<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>19.call与apply</title>
</head>

<body>
  <button>hdcms</button>
  <button>houdunren</button>
  <script>
    // call 和 apply 都是将对象绑定到函数的this上， 的区别就是在传递参数上的不同

    let lisi = {
      name: '李四'
    };
    let wangwu = {
      name: '王五'
    };
    function User (web, url) {
      console.log(web + url + this.name);
    }
    // 第一个参数：this要指向的对象，后面的参数是需要传递的参数
    //- apply 用数组传参
    //- call 需要分别传参
    //- 与 bind 不同 call / apply 会立即执行函数
    User.call(lisi, '后盾人', 'houdunren.com'); //李四 this被指向 lisi，会立即执行
    User.apply(wangwu, ['后盾人', 'houdunren.com']); //王五 this被指向 wangwu，会立即执行

    function show () {
      alert(this.innerText);
    }
    let buttons = document.querySelectorAll('button');
    for (let i = 0; i < buttons.length; i++) {
      buttons[i].addEventListener('click', event => {
        show.call(event.target); //把对象传给show 改变this的值
      });
    }
    //找数组中的数值最大值,

    //  需要借用Math.max() 方法，但是这个方法不接收数组。我们可以通过

    //1. 使用apply方法将数组传递给Math.max方法（apply可以传递数组）
    //2. 使用展开语法（三点语法）将数组展开成普通的参数
    let arr = [1, 3, 2, 8];
    console.log(Math.max(arr)); //NaN
    console.log(Math.max.apply(Math, arr)); //8
    console.log(Math.max(...arr)); //8

  </script>
</body>

</html>